<%--
    Document   : addBook
    Created on : Nov 5, 2011, 12:47:29 PM
    Author     : luca
--%>
<%@page import="bibliOnline.util.details.BookDetails"%>
<%@page contentType="application/json" pageEncoding="UTF-8"%>
<%@taglib prefix="json" uri="http://www.atg.com/taglibs/json"%>
<%@page import="java.util.Collection"%>
<%@page import="java.util.ArrayList"%>
<%@page import="bibliOnline.util.Message"%>
<%@page import="bibliOnline.util.details.BookDetails"%>
<%@page import="bibliOnline.db.BookInserter"%>
<%@page import="bibliOnline.util.details.UserDetails"%>

<%-- BUSINESS LOGIC --%>
<%
    //  messaggi di risposta
    //  e' un vettore di coppie (id, value) in cui id rappresenta
    //  l'identificatore del tag html a cui il messaggio sara' associato
    Collection messages;
    messages = new ArrayList();
    //  indicano se sono andati a buon fine il controllo autenticazione,
    //  il controllo parametri e l'accesso al db
    boolean authCheckOk, paramCheckOk, dbOk;
    authCheckOk = true;
    paramCheckOk = true;
    dbOk = true;
    //  oggetto che incapsula i dettagli di un libro
    BookDetails book;
    book = new BookDetails();

    //
    //      1 - CONTROLLO AUTENTICAZIONE
    //
    UserDetails user;
    user = (UserDetails) session.getAttribute("user_data");
    
    if(user == null || user.getType().equals(UserDetails.LIBRARIAN) == false)
    {
        messages.add(new Message("response", "Aggiunta libro: accesso negato"));
        authCheckOk = false;
    }

    //
    //      2 - CONTROLLO PARAMETRI
    //
    if (authCheckOk) {
        String author, title, publisher, edition, genre, year;

        author = request.getParameter("author");
        title = request.getParameter("title");
        publisher = request.getParameter("publisher");
        edition = request.getParameter("edition");
        genre = request.getParameter("genre");
        year = request.getParameter("year");

        //  param check
        try {
            book.checkAndSetAuthor(author);
        } catch (Exception ex) {
            messages.add(new Message("author", ex.getMessage()));
            paramCheckOk = false;
        }
        try {
            book.checkAndSetTitle(title);
        } catch (Exception ex) {
            messages.add(new Message("title", ex.getMessage()));
            paramCheckOk = false;
        }
        try {
            book.checkAndSetPublisher(publisher);
        } catch (Exception ex) {
            messages.add(new Message("publisher", ex.getMessage()));
            paramCheckOk = false;
        }
        try {
            book.checkAndSetEdition(edition);
        } catch (Exception ex) {
            messages.add(new Message("edition", ex.getMessage()));
            paramCheckOk = false;
        }
        try {
            book.checkAndSetGenre(genre);
        } catch (Exception ex) {
            messages.add(new Message("genre", ex.getMessage()));
            paramCheckOk = false;
        }
        try {
            book.checkAndSetYear(year);
        } catch (Exception ex) {
            messages.add(new Message("year", ex.getMessage()));
            paramCheckOk = false;
        }
    }

    //
    //      3 - ACCESSO AL DATABASE
    //
    if (authCheckOk && paramCheckOk) {
        try {
            if (BookInserter.exists(book)) {
                messages.add(new Message("response", "Il libro inserito esiste gia'"));
                dbOk = false;
            } else {
                BookInserter.insert(book);
                messages.add(new Message("response", "Libro '" + book.getTitle()
                        + "' inserito correttamente"));
            }
        } catch (Exception ex) {
            messages.add(new Message("response", ex.getMessage()));
            dbOk = false;
        }
    }

    //  aggiungo al contesto della pagina
    //      - il numero dei messaggi prodotti
    //      - la collezione dei messaggi prodotti
    //      - una variabile che indica il successo o meno dell'operazione
    //  in questo modo posso referenziare queste info nei tag json qui sotto
    pageContext.setAttribute("messagesCount", messages.size());
    pageContext.setAttribute("messages", messages);
    pageContext.setAttribute("successful", authCheckOk && paramCheckOk && dbOk);
%>

<%-- PRESENTATION --%>
<json:object>
    <json:property name="messagesCount" value="${messagesCount}" />
    <json:array name="messages" items="${messages}" var="msg">
        <json:object>
            <json:property name="id" value="${msg.id}" />
            <json:property name="value" value="${msg.value}" />
        </json:object>
    </json:array>
    <json:property name="successful" value="${successful}" />
</json:object>
